﻿										/*【算法1-3】暴力枚举*/

//// P2241 统计方形（数据加强版）
//// https://www.luogu.com.cn/problem/P2241
//
//// 题解：https://www.luogu.com.cn/problem/solution/P2241
//
//#include <iostream>
//#include <cstring>
//#include <algorithm>
//#include <vector>
//#include <cmath>
//#include <unordered_map>
//#include <unordered_set>
//#include <map>
//#include <set>
//#include <queue>
//#include <stack>
//#include <deque>
//#include <functional>
//#include <climits>
//
//#define quickio ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
//#define endl "\n"
//
//using namespace std;
//typedef long long ll;
//
//// 60分
//void solve()
//{
//	int n, m;
//	cin >> n >> m;
//	ll ans1 = 0, ans2 = 0;
//	
//	int num = 0;
//	for (int i = 1; i <= n; i++)
//	{
//		for (int j = 1; j <= m; j++)
//		{
//			for (int x = 1; x + i - 1 <= n; x++)
//			{
//				if (x == 1)
//				{
//					for (int y = 1; y + j - 1 <= m; y++)
//					{
//						if (i == j)
//							ans1++;
//						else
//							ans2++;
//						num++;
//					}
//				}
//				else
//				{
//					if (i == j)
//						ans1 += num;
//					else
//						ans2 += num;
//				}
//			}
//			num = 0;
//		}
//	}
//	
//	cout << ans1 << ' ' << ans2 << endl;
//}
//
//// AC
//void solve1()
//{
//	int n, m;
//	cin >> n >> m;
//	ll/**/ ans1 = 0, ans2 = 0;
//	
//	for (int i = 1; i <= n; i++)
//	{
//		for (int j = 1; j <= m; j++)
//		{
//			if (i == j)
//				ans1 += (n - i + 1) * (m - j + 1);
//			else
//				ans2 += (n - i + 1) * (m - j + 1);
//		}
//	}
//	cout << ans1 << ' ' << ans2 << endl;
//}
//
//int main()
//{
//	quickio;
//	solve();
//	return 0;
//}


//// P2089 烤鸡
//// https://www.luogu.com.cn/problem/P2089
//
//#include <iostream>
//#include <cstring>
//#include <algorithm>
//#include <vector>
//#include <cmath>
//#include <unordered_map>
//#include <unordered_set>
//#include <map>
//#include <set>
//#include <queue>
//#include <stack>
//#include <deque>
//#include <functional>
//#include <climits>
//
//#define quickio ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
//#define endl "\n"
//
//using namespace std;
//typedef long long ll;
//
//int ret = 0;
//vector<vector<int>>v;
//
//void backtracking(int ans[], int begin, int n)
//{
//	if (n == 0)
//	{
//		ret++;
//		v.push_back(vector<int>(ans, ans + 10));
//		return;
//	}
//
//	for (int j = begin; j < 10; j++)
//	{
//		for (int i = 1; i <= 2/**/; i++)
//		{
//			if (n - i >= 0)
//			{
//				ans[j] += i;
//				backtracking(ans, j + 1, n - i);
//				ans[j] -= i;
//			}
//			else
//				break;
//		}
//	}
//}
//
//void solve()
//{
//	int n;
//	cin >> n;
//	if (n < 10)
//	{
//		cout << 0;
//		return;
//	}
//	else if (n == 10)
//	{
//		cout << 1 << endl;
//		while (n--)
//			cout << 1 << ' ';
//		return;
//	}
//
//	n -= 10;
//	int ans[10] = { 0 };
//
//	backtracking(ans, 0, n);
//	sort(v.begin(), v.end());
//	cout << ret << endl;
//	if (ret)
//	{
//		for (int j = 0; j < ret; j++)
//		{
//			for (int i = 0; i < 10; i++)
//			{
//				cout << 1 + v[j][i] << ' ';
//			}
//			cout << endl;
//		}
//	}
//}
//
//int main()
//{
//	quickio;
//	solve();
//	return 0;
//}


//// P1618 三连击（升级版）
//// https://www.luogu.com.cn/problem/P1618
//
//#include <iostream>
//#include <cstring>
//#include <algorithm>
//#include <vector>
//#include <cmath>
//#include <unordered_map>
//#include <unordered_set>
//#include <map>
//#include <set>
//#include <queue>
//#include <stack>
//#include <deque>
//#include <functional>
//#include <climits>
//
//#define quickio ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
//#define endl "\n"
//
//using namespace std;
//typedef long long ll;
//
//int A, B, C;
//int a, b, c;
//vector<vector<int>>v;
//int book[10] = { 0 };
//unordered_map<int, int>mp;
//
//void backtracking(int ans[], int lena, int lenb, int lenc)
//{
//	if (lena == 3  && lena == lenb  && lenc == 3)
//	{
//		auto it = mp.find(a);
//		if ((it == mp.end()) 
//			&& ((b * 1.0) / (a * 1.0) == (B * 1.0) / (A * 1.0)) 
//			&& ((c * 1.0) / (a * 1.0) == (C * 1.0) / (A * 1.0)) 
//			&& ((c * 1.0) / (b * 1.0) == (C * 1.0) / (B * 1.0)))
//		{
//			ans[0] = a;
//			ans[1] = b;
//			ans[2] = c;
//			v.push_back(vector<int>(ans, ans + 3));
//			mp.insert({ a, 0 });
//		}
//		return;
//	}
//
//	for (int i = 1; i <= 9; i++)
//	{
//		if (book[i] == 0)
//		{
//			book[i] = 1;
//			if (lena < 3)
//			{
//				a += pow(10, lena) * i;
//				lena++;
//				if (lena == 3 && mp.find(a) != mp.end())
//					;
//				else
//					backtracking(ans, lena, lenb, lenc);
//				lena--;
//				a -= pow(10, lena) * i;// 一定要lena--后才能这样子，bc同理
//			}
//			else if (lenb < 3)
//			{
//				b += pow(10, lenb) * i;
//				lenb++;
//				backtracking(ans, lena, lenb, lenc);
//				lenb--;
//				b -= pow(10, lenb) * i;
//			}
//			else if (lenc < 3)
//			{
//				c += pow(10, lenc) * i;
//				lenc++;
//				backtracking(ans, lena, lenb, lenc);
//				lenc--;
//				c -= pow(10, lenc) * i;
//			}
//			book[i] = 0;
//		}
//	}
//}
//
//void solve()
//{
//	int ans[3] = { 0 };
//	cin >> A >> B >> C;
//
//	backtracking(ans, 0, 0, 0);
//	int size = v.size();
//	if (size == 0)
//	{
//		cout << "No!!!";
//		return;
//	}
//	sort(v.begin(), v.end());
//	for (int i = 0; i < size; i++)
//	{
//		for (int j = 0; j < 3; j++)
//		{
//			cout << v[i][j] << ' ';
//		}
//		cout << endl;
//	}
//}
//
//int main()
//{
//	quickio;
//	solve();
//	return 0;
//}


//// P1036 [NOIP2002 普及组] 选数
//// https://www.luogu.com.cn/problem/P1036
//
//#include <iostream>
//#include <cstring>
//#include <algorithm>
//#include <vector>
//#include <cmath>
//#include <unordered_map>
//#include <unordered_set>
//#include <map>
//#include <set>
//#include <queue>
//#include <stack>
//#include <deque>
//#include <functional>
//#include <climits>
//
//#define quickio ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
//#define endl "\n"
//
//using namespace std;
//typedef long long ll;
//
//int n, k;
//int ans = 0;
//int book[20] = { 0 };
//vector<int>v;
//
//bool isPrime(int x)
//{
//	if (x < 3)
//		return x > 1;
//	if (x % 6 != 1 && x % 6 != 5)
//		return false;
//
//	int m = sqrt(x);
//	for (int i = 5; i <= m; i += 6)
//	{
//		if ((x % i == 0) || (x % (i + 2) == 0))
//			return false;
//	}
//
//	return true;
//}
//
//void backtracking(int sum, int num, int start)
//{
//	if (num == k)
//	{
//		if (isPrime(sum))
//			ans++;
//		return;
//	}
//
//	for (int i = start; i < v.size(); i++)
//	{
//		if (book[i] == 0)
//		{
//			book[i] = 1;
//			sum += v[i];
//			backtracking(sum, num + 1, i + 1);
//			sum -= v[i];
//			book[i] = 0;
//		}
//	}
//}
//
//void solve()
//{
//	cin >> n >> k;
//	v.resize(n);
//	for (int i = 0; i < n; i++)
//		cin >> v[i];
//	backtracking(0, 0, 0);
//	cout << ans;
//}
//
//int main()
//{
//	quickio;
//	solve();
//	return 0;
//}



//// P1157 组合的输出
//// https://www.luogu.com.cn/problem/P1157
//
//#include <iostream>
//#include <cstring>
//#include <algorithm>
//#include <vector>
//#include <cmath>
//#include <unordered_map>
//#include <unordered_set>
//#include <map>
//#include <set>
//#include <queue>
//#include <stack>
//#include <deque>
//#include <functional>
//#include <iomanip>
//#include <climits>
//
//#define quickio ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
//#define endl "\n"
//
//using namespace std;
//typedef long long ll;
//
//int n, r;
//int book[21] = { 0 };
//vector<int>v;
//
//void backtracking(int num, int start)
//{
//	if (num == r)
//	{
//		for (int i = 0; i < r; i++)
//			cout << setw(3) << v[i];
//		cout << endl;
//		return;
//	}
//
//	for (int i = start; i < n; i++)
//	{
//		if (book[i] == 0)
//		{
//			book[i] = 1;
//			v.push_back(i + 1);
//			backtracking(num + 1, i + 1);
//			v.pop_back();
//			book[i] = 0;
//		}
//	}
//}
//
//void solve()
//{
//	cin >> n  >> r;
//	backtracking(0, 0);
//}
//
//int main()
//{
//	quickio;
//	solve();
//	return 0;
//}






//// P1157 组合的输出
//// https://www.luogu.com.cn/problem/P1157
//
//#include <iostream>
//#include <cstring>
//#include <algorithm>
//#include <vector>
//#include <cmath>
//#include <unordered_map>
//#include <unordered_set>
//#include <map>
//#include <set>
//#include <queue>
//#include <stack>
//#include <deque>
//#include <functional>
//#include <iomanip>
//#include <climits>
//
//#define quickio ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
//#define endl "\n"
//
//using namespace std;
//typedef long long ll;
//
//int n;
//int book[21] = { 0 };
//vector<int>v;
//
//void backtracking(int num)
//{
//	if (num == n)
//	{
//		for (int i = 0; i < n; i++)
//			cout << setw(5) << v[i];
//		cout << endl;
//		return;
//	}
//
//	for (int i = 0; i < n; i++)
//	{
//		if (book[i] == 0)
//		{
//			book[i] = 1;
//			v.push_back(i + 1);
//			backtracking(num + 1);
//			v.pop_back();
//			book[i] = 0;
//		}
//	}
//}
//
//void solve()
//{
//	cin >> n;
//	backtracking(0);
//}
//
//int main()
//{
//	quickio;
//	solve();
//	return 0;
//}



// P1088 [NOIP2004 普及组] 火星人
// https://www.luogu.com.cn/problem/P1088

#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <cmath>
#include <unordered_map>
#include <unordered_set>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <deque>
#include <functional>
#include <iomanip>
#include <climits>

#define quickio ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define endl "\n"

using namespace std;
typedef long long ll;

int n;
vector<int> book;

//vector<string>v;
//// 不可行，深度太深了，要转化为循环来做 ------------------> 没想到
//// 优化 ----------------> 只要进行到火星人手指的那个顺序，再进行m次，就好了
//void backtracking(int num, string& path)
//{
//	if (num == n)
//	{
//		v.push_back(path);
//		return;
//	}
//
//	for (int i = 1; i <= n; i++)
//	{
//		if (book[i] == 0)
//		{
//			book[i] = 1;
//			string s = to_string(i);
//			path += s;
//			backtracking(num + 1, path);
//			path.resize(path.size() - s.size());
//			book[i] = 0;
//		}
//	}
//}
//
//void solve1()
//{
//	cin >> n;
//	book.resize(n + 1);
//	string path;
//	backtracking(0, path);
//	cout << 2;
//	//sort(v.begin(), v.end());
//
//	int m;
//	cin >> m;
//	string s;
//	char ch;
//	for (int i = 0; i < n; i++)
//	{
//		cin >> ch;
//		s += ch;
//	}
//
//	int i = find(v.begin(), v.end(), s) - v.begin();
//	s = v[i + m];
//	for (int i = 0; i < n; i++)
//	{
//		cout << s[i];
//		if (i != n - 1)
//			cout << ' ';
//	}
//}


// 超时（心情写在脸上
string s;
int m;
void backtracking(int num, string& path, int& k)
{
	if (num == n)
	{
		if (path == s)
		{
			k = 0;
			return;
		}

		if (k != -1)
			k++;
		if (k == m)
			return;

		return;
	}

	for (int i = 1; i <= n; i++)
	{
		if (book[i] == 0)
		{
			book[i] = 1;
			string s = to_string(i);
			path += s;
			int size = s.size();
			backtracking(num + 1, path, k);
			if (k == m)
				return;
			path.resize(path.size() - size);
			book[i] = 0;
		}
	}
}

void solve1()
{
	cin >> n;
	string path;
	//sort(v.begin(), v.end());

	cin >> m;
	char ch;
	for (int i = 0; i < n; i++)
	{
		cin >> ch;
		s += ch;
	}

	int k = -1;
	backtracking(0, path, k);

	for (int i = 0; i < n; i++)
	{
		cout << path[i];
		if (i != n - 1)
			cout << ' ';
	}
}

// unaccept20分
void solve2()
{
	cin >> n;

	int m;
	cin >> m;
	string s;
	char ch;
	for (int i = 0; i < n; i++)
	{
		cin >> ch;
		s += ch;
	}

	while (m--)
	{
		next_permutation(s.begin(), s.end());
	}
	for (int i = 0; i < n; i++)
	{
		cout << s[i];
		if (i != n - 1)
			cout << ' ';
	}
}

// 题解：https://www.luogu.com.cn/article/vb1m6qp0
// 变进制数

// 20分，WA了
void solve3()
{
	cin >> n;

	int m;
	cin >> m;
	string s;
	char ch;
	string key1, key2;
	for (int i = 0; i < n; i++)
	{
		cin >> ch;
		s += ch;

		key1 += to_string(i + 1);
	}
	key2 = key1;
	
	vector<int>ans;
	// 变为进制数
	for (int i = 0; i < n; i++)
	{
		int j = key1.find(s[i]);
		ans.push_back(j);
		key1.erase(j, 1);
	}

	ans[ans.size() - 1] = ans[ans.size() - 1] + m;
	// 还原为火星数
	for (int i = 0; i < n; i++)
	{
		int x = ans[n - 1 - i];
		int jz = i + 1;
		if (x > i)
		{
			if (i < n - 1)
				ans[n - 1 - i - 1] += ans[n - 1 - i] / jz/*下一位 / 该位的进制*/;
			else
				ans.insert(ans.begin(), jz);

			ans[n - 1 - i] %= jz;/*本位 % 该位的进制*/
		}
		else
			break;
	}

	key1 = key2;
	for (int i = 0; i < n; i++)
	{
		cout << key1[ans[i]];
		if (i != n - 1)
			cout << ' ';
		key1.erase(ans[i], 1);
	}
}

// 康托展开（要用到前缀积、树状数组）
/*
康托展开讲的是什么故事呢？是这样的：对于一个1到n的排列
{a1,a2,⋯ ,an}，比它小的排列有这些个：∑(i=1~n) SUMai×(n−i)!
，而SUMai ，就是在ai 后面的元素里比它小的元素个数，即∑(j=i ~ n)(aj<ai)
是不是大家开始一脸懵了呢？没关系，这是正常现象，因为上面那两句压根不是给人看的，咱们还是从一个具体的栗子讲起：
2,4,1,5,3

看这个排列，怎样求他是第几小的呢？别急，咱们一位一位去考虑！

第一位是2，比它小的就只有一个1了，所以只有1放在这一位，才会比它小，那后面的呢？你爱怎么排怎么排！
后面有4个数，所以一共有4!种排列方法，也就是说一共有1×4!1×4!种方法
第二位是4，比它小的有1,2,3，但是2已经在前面固定了，所以能放在这一位的就只有1,3这2个数，而后面呢，有3个数，就有3!种排列方法，所以一共有2×3!种方法
第三位的1没有更小的啦，所以一共是0×2!种方法
第四位在5后面有比5小的3，一共1个数，1×1!种方法
第五位其实压根都不用考虑了，反正都用过了，要考虑的话也是0×0!种方法
最后我们再把每一位的加起来：
1×4!+2×3!+0×2!+1×1!+0×0!=36种，所以排名是第37名
*/
void solve()
{
	int m, n;
	cin >> n >> m;
	book.resize(n + 1);
	vector<int>a(n + 1);

	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
		int x = a[i];
		for (int j = 1; j <= a[i]; j++)
		{
			if (book[j])
				x--;
		}
		book[a[i]] = 1;
		a[i] = x - 1;
	}

	a[n] += m;
	for (int i = n; i > 0; i--)
	{
		a[n - 1] += a[n] / (n - i + 1);
		a[n] %= (n - i + 1);
	}

	book.resize(0);/**/
	book.resize(n + 10, 0);/*将book全置为0*/

	for (int i = 1; i <= n; i++)
	{
		for (int j = 0; j <= a[i]; j++)
		{
			if (book[j])
				a[i]++;
		}
		cout << a[i] + 1;
		if (i < n)
			cout << ' ';
		book[a[i]] = 1;
	}
}

int main()
{
	quickio;
	solve();
	return 0;
}